package Controllers;

import com.db4o.ObjectContainer;
import com.db4o.query.Predicate;
import Configs.Config;
import com.db4o.ObjectSet;
import com.db4o.query.Query;
import java.util.List;
import java.util.Set;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import models.GioiTinh;
import models.NhanVien;
import models.TaiKhoan;

public class NhanVienController {

    private  Config conn;

    public NhanVienController(Config conn) {
        this.conn = conn;
    }
    
    public boolean checkexist(String MSNV){
        NhanVien nv = this.getWithMSNV(MSNV);
        if(nv == null)
                return false;
        else 
                return true;
    }
    
    //lay nhan vien voi msnv theo native query
    public NhanVien getWithMSNV(String msnv) {
        ObjectContainer db = this.conn.getConn();
        ObjectSet<NhanVien> nhanviens = db.query(new Predicate<NhanVien>() {
            @Override
            public boolean match(NhanVien nhanvien) {
                return (nhanvien.getMSNV().equals(msnv));
            }
        });
        if(nhanviens.size()==0)
            return null;
        else
            return nhanviens.get(0);
    }

       //lay tap hop nhan vien cmnd theo soda 
    public boolean getWithCMND(String cmnd) { 
        Query query = this.conn.getConn().query();
        query.constrain(NhanVien.class);
        query.descend("CMND").constrain(cmnd).equal();
       ObjectSet<NhanVien> nvs = query.execute();
       if(nvs.isEmpty())
        return true;
       else
        return false;
    }
    //lay tap hop nhan vien voi soda
    public ObjectSet<NhanVien> getWithHoTen_MSNV(String tim) { 
       Query query = this.conn.getConn().query();
       query.constrain(NhanVien.class);
       query.descend("hoten").constrain(tim).like().endsWith(true).startsWith(true).or(query.descend("MSNV").constrain(tim).like().endsWith(true).startsWith(true));
       query.descend("isDel").constrain(false).equal();
       ObjectSet<NhanVien> nvs = query.execute();
       return nvs;
    }
    //lay tap hop nhan vien voi query by example 
    public ObjectSet<NhanVien> getAllNhanVien(){
        Query query = conn.getConn().query();
        query.constrain(NhanVien.class);
        ObjectSet<NhanVien> nvs = query.execute();
        return nvs;
    }
    //tao ma nv tu dong
    public int taoMSNV(){
        int msnv =0;
        ObjectSet<NhanVien> nvs = this.getAllNhanVien();
        if(nvs.isEmpty()){
            msnv = 1000;
        }
        else{
            msnv = Integer.parseInt(nvs.get(nvs.size()-1).getMSNV())+1;
        }         
        return msnv;
    }
     public ObjectSet<NhanVien> getAllNhanVienNotIsdelete(){
       ObjectSet<NhanVien> nvs = this.conn.getConn().query(new Predicate<NhanVien>() {
            @Override
            public boolean match(NhanVien nhanvien) {
                return (nhanvien.getIsDel() == false);
            }
        });
        return nvs;
    }
    
    public void showAllNhanVien(JTable tbdsnv){
        DefaultTableModel model = (DefaultTableModel) tbdsnv.getModel();
        ObjectSet<NhanVien> nvs = this.getAllNhanVien();
       
        int stt =0;
        if(nvs.size() !=0){
            for(NhanVien nv : nvs){
                if(nv.getIsDel() == false){
                    Object[]  row = {++stt, nv.getMSNV(), nv.getHoten(), nv.getGioitinh()};
                    model.addRow(row);
                }
            }
        }
        
    }
    public void showAllNhanVien_isdelete(JTable tbdsnv){
        DefaultTableModel model = (DefaultTableModel) tbdsnv.getModel();
        ObjectSet<NhanVien> nvs = this.getAllNhanVien();
       
        int stt =0;
        if(nvs.size() !=0){
            for(NhanVien nv : nvs){
                if(nv.getIsDel() == true){
                    Object[]  row = {++stt, nv.getMSNV(), nv.getHoten(), nv.getGioitinh()};
                    model.addRow(row);
                }
            }
        }
        
    }
    
        public void showTimkiem(JTable tbdsnv, ObjectSet<NhanVien> nvs){
            DefaultTableModel model = (DefaultTableModel) tbdsnv.getModel();
            int stt =0;
            if(nvs.size() !=0){
                for(NhanVien nv : nvs){
                Object[]  row = {++stt, nv.getMSNV(), nv.getHoten(), nv.getGioitinh()};
                model.addRow(row);
                }
            }
        
    }
    public void editNhanVien(NhanVien nv){
        NhanVien nvEdit = this.getWithMSNV(nv.getMSNV());
        nvEdit.setCMND(nv.getCMND());
        nvEdit.setGioitinh(nv.getGioitinh());
        nvEdit.setHoten(nv.getHoten());
        nvEdit.setNgaysinh(nv.getNgaysinh());
        nvEdit.setSdt(nv.getSdt());
        nvEdit.setIsDel(nv.getIsDel());
        this.conn.getConn().store(nvEdit);
        
    }
    
    public void insertNhanVien(NhanVien nv){
        NhanVien nvInsert = new NhanVien(nv.getCMND(), nv.getHoten(), nv.getGioitinh(), nv.getSdt(), nv.getNgaysinh());
        nvInsert.setMSNV(nv.getMSNV());
        this.conn.getConn().store(nvInsert);
        
    }
    
     public void deleteNhanVien(NhanVien nv){
        NhanVien nvdelete = this.getWithMSNV(nv.getMSNV());
        Set<TaiKhoan> tks = nvdelete.getNguoidung();
        if(!tks.isEmpty()){
            for(TaiKhoan tk : tks){
                tk.setIsdelete(true);
            }
        }
        nvdelete.setIsDel(true);
        this.conn.getConn().store(nvdelete); 
        
    }

}
